#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:taotieren

"""
    rpi.gpio 需要 root 权限，板上运行需要使用
    sudo python switch_2_pos.py
    使用 SparkFun 数字键盘的项目布线图
    列：3，1，5
    行：2，7，6，4

        3   1   5
    2   1   2   3
    7   4   5   6
    6   7   8   9
    4   *   0   #

"""

""" 非树莓派环境下可以用 rpi.gpio_def 代替 rpi.gpio 来进行程序调试和验证 """
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

rows = [17, 25, 24, 23]
cols = [27, 18, 22]
keys = [
    ['1', '2', '3'],
    ['4', '5', '6'],
    ['7', '8', '9'],
    ['*', '0', '#']
]

"""
    因为需要初始化很多输入和输出引脚，所以可以使用循环语句来初始化所有行和列引脚。
"""
for row_pin in rows:
    GPIO.setup(row_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

for col_pin in cols:
    GPIO.setup(col_pin, GPIO.OUT)

"""
    所有实际动作都是在函数 get_key() 中运行
    他会依次启用每一列，设置为高电平；
    通过内部循环来依次检测每一行，
    如果某一行为高电平，keys 数组中寻找与这一行和这一列对应的键名，
    如果没有检测到任何动作，会返回默认值 key(0)
"""


def get_key():
    key = 0
    for col_num, col_pin in enumerate(cols):
        GPIO.output(col_pin, 1)
        for row_num, row_pin in enumerate(rows):
            if GPIO.input(row_pin):
                key = keys[row_num][col_num]
        GPIO.output(col_pin, 0)
    return key


"""
    while 只是获取键的值并打印
    sleep 只是用于降低输出速度
"""
while True:
    key = get_key()
    if key:
        print(key)
    time.sleep(0.3)
